// require modules
const fs = require('fs');
const archiver = require('archiver');
module.exports = function (path,name,project,mode) {
    delZips(path+name +'-'+ project + '.zip').then(res=>{
        // create a file to stream archive data to.
        const output = fs.createWriteStream(path+name +'-'+ project+ '-' + mode+ '.zip');
        const archive = archiver('zip', {
        zlib: { level: 9 } // Sets the compression level.
        });
        // listen for all archive data to be written
        // 'close' event is fired only when a file descriptor is involved
        output.on('close', function() {
        console.log(archive.pointer() + ' total bytes');
        console.log('archiver has been finalized and the output file descriptor has closed.');
        });
        // This event is fired when the data source is drained no matter what was the data source.
        // It is not part of this library but rather from the NodeJS Stream API.
        // @see: https://nodejs.org/api/stream.html#stream_event_end
        output.on('end', function() {
        console.log('Data has been drained');
        });

        // good practice to catch warnings (ie stat failures and other non-blocking errors)
        archive.on('warning', function(err) {
        if (err.code === 'ENOENT') {
            // log warning
        } else {
            // throw error
            throw err;
        }
        });
        // good practice to catch this error explicitly
        archive.on('error', function(err) {
        throw err;
        });
        // pipe archive data to the file
        archive.pipe(output);
        archive.directory(path+name +'-'+ project + '-' + mode, false);
        archive.finalize();
    })
}

//如果存在zip包 需要先删除zip包
const delZips = (zip)=>{
   return new Promise((resolve,reject)=>{
        fs.access(zip, (err) => {
            if (err) {
                //不存在
                resolve()
            } else {
                //存在
                fs.unlink(zip, function(err){
                    if(err){
                        reject(err)
                         throw err;
                    }
                    resolve()
               })
            }
        })
    })
    

}